好的~那麼先說說昨天應該要說的 Service,Service 是負責扮演對外溝通的腳色,每次建立時都會提供一組IP並對應到指定的 Port,另外 Service 本身提供了四種類型,分別是:
Service 與 Pod 溝通
首先需要先撰寫 Service yml
## service.yml
apiVersion: v1                         ## k8s api 版本號
kind: Service                          ## 創立服務類型
metadata:
  name: hello-service                  ## 指定該Service的名稱
spec:
  type: NodePort                       ## 指定Service的型別,可以是NodePort或是LoadBalancer
  selector:
    app: my-app                        ## 對應那一個Pod的標籤
  ports:
  - port: 8099                         ## 容器外 Port
    targetPort: 80                     ## 容器內 Port
接著執行 kubectl apply -f service.yml 就完成 Service建立了
或這你也可以將兩個yml檔案合併成一支檔案,如下方範例(記得以虛線隔開):
## nginx.yml
apiVersion: v1                         ## k8s api 版本號
kind: Pod                              ## 創立服務類型
metadata:
  name: my-pod                         ## Pod 的名稱
  labels:
    app: my-app                        ## Pod 的標籤「app: my-app 」
spec:                                  ## spec 定義 container 資訊
  containers:
  - name: my-first-container           ## 設定 container 的名稱
    image: nginx                       ## 映像檔
    ports:                             ## 啟動哪些 port number 是允許外部資源存取
      - containerPort: 80
---
apiVersion: v1                         ## k8s api 版本號
kind: Service                          ## 創立服務類型
metadata:
  name: hello-service                  ## 指定該Service的名稱
spec:
  type: NodePort                       ## 指定Service的型別,可以是NodePort或是LoadBalancer
  selector:
    app: my-app                        ## 對應那一個Pod的標籤
  ports:
  - port: 8099                         ## 容器外 Port
    targetPort: 80                     ## 容器內 Port
上面說了 Service 與 Pod的溝通方式,但其實在應用上並不會這樣使用,原因是 Pod 本身無法「自行擴展(Scaling)」,這至少需要 Replication Controller 才能達到,另外一個原因是無法達到「系統升級(Rollout)」、「系統回朔(Rollback)」,這至少要 Deployment 才可以做到。
就上述的兩個原因,就可以知道 Pod 雖然是 K8S 建立服務的最小單位,但是實際上在應用時,透過 Deployment 自動產生 Pod,並且讓 Service 與 Deployment 溝通才是比較好的選擇,明天會說明 Deployment 是什麼。